package javase.synchronizedDemo;

/**
 * create by LiangYM @Date 2020/7/29 17:06
 * synchronized 是可重入锁
 **/
public class SynchronizedDemo {

    public static synchronized void m1(){
        //多个线程访问同一个资源必须上锁
        System.out.println(Thread.currentThread().getName()+" m1 start");

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //因为synchronized是可重入锁，所以在一个线程里面可以调m2方法，如果不是可重入，则会死锁
//        m2();
        System.out.println(Thread.currentThread().getName()+" m1 end");


    }
    //这里如果加synchronized 修饰m2方法后当一个线程获取了该对象的锁之后，其他线程来访问其他synchronized实例方法则需要等待线程1先把锁释放
    //如果不加synchronized 则不存在互斥，m2的输出可以在线程一中并行
    public static /*synchronized */ void m2(){
        //多个线程访问同一个资源必须上锁
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+" m2 start");
    }

    public static void main(String[] args) {
        new Thread(SynchronizedDemo::m1).start();
        new Thread(SynchronizedDemo::m2).start();
    }

}